package com.serve.oa.controller;


import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.junit.jupiter.api.extension.ExtendWith;

import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


//    List 实现
//    ArrayList
//            LinkedList
//    Vector
//    Stack（继承自 Vector）
//    Set 实现
//    HashSet
//            LinkedHashSet
//    TreeSet
//    Map 实现
//    HashMap
//            LinkedHashMap
//    TreeMap
//            Hashtable
//    ConcurrentHashMap
//            WeakHashMap
//    IdentityHashMap
//    Queue 实现
//    LinkedList（也实现了 Deque 接口）
//    PriorityQueue
//            ArrayDeque
//    DelayQueue
//            LinkedBlockingQueue
//    ArrayBlockingQueue
//            PriorityBlockingQueue
//    Deque 实现
//    ArrayDeque
//    LinkedList（也实现了 List 和 Queue 接口）
//    SortedSet 实现
//    TreeSet
//    SortedMap 实现
//    TreeMap
//    BlockingQueue 实现
//    ArrayBlockingQueue
//    LinkedBlockingQueue
//    PriorityBlockingQueue
//    DelayQueue
//    ConcurrentMap 实现
//    ConcurrentHashMap
//    ConcurrentSkipListMap
//    其他
//            CopyOnWriteArrayList
//    CopyOnWriteArraySet
//    EnumMap（基于 HashMap 的映射，键必须是枚举类型）
//    EnumSet（基于位向量实现的集合，元素必须是枚举类型）
//    这些是Java集合框架中的主要实现。每个实现都有其特定的用途和性能特点，可以根据具体需求选择合适的集合类型。再次为之前的遗漏道歉。


public class Fbss {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    private static Object resource1 = new Object();//资源 1
    private static Object resource2 = new Object();//资源 2


    @Test
    public void testMyMethod() {

        new Thread(() -> {
            synchronized (resource1) {
                System.out.println(Thread.currentThread() + "get resource1");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource2");
                synchronized (resource2) {
                    System.out.println(Thread.currentThread() + "get resource2");
                }
            }
        }, "线程 1").start();

        new Thread(() -> {
            synchronized (resource2) {
                System.out.println(Thread.currentThread() + "get resource2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource1");
                synchronized (resource1) {
                    System.out.println(Thread.currentThread() + "get resource1");
                }
            }
        }, "线程 2").start();


    }
}



class Person {
    private String name;

    private String phoneNumber;

    public Person(String name, String phoneNumber) {
        this.name = name;
        this.phoneNumber = phoneNumber;
    }

    public String getName() {
        return name;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }
}
